import random
import pickle
import os
import copy

# 创建类
class DoubleColorBall:

    @staticmethod
    def doubleColorBallRule():
        mstr = \
        """
     
=============================================
    为了营造良好的游戏环境,
    请您在投注时，看管好自己的个人物品，
    投注结束后，将彩票凭据妥善保存，
    谢谢您的合作。
=============================================
        
        """

        print(mstr)

    # 添加菜单
    __menu = [
        "自选双色球",
        "机选双色球",
        "投注",
        "结账",
        "查看历史投注记录",
        "退出",
    ]
    __fileName = "ball.dat"  #保存数据的文件名

    @classmethod
    def __showMenu(cls):
        for ind, cont in enumerate(cls.__menu, start=1):
            print("{ii} {cc}".\
                  format(ii = ind, cc = cont))

    def __init__(self, _name, _password):
        # 保存双色球相关信息
        self.__redList = []
        self.__blueList = []
        self.__betlist = []

        # 保存双色球全部信息   保存这个数据  只能保存一次投注
        self.__doubleColorBallInfo = {"红球":[], "蓝球":[], "注数":[]}

        #根据文件是否存在判断是否需要加载数据
        if os.path.exists(self.__fileName):
            self.load()
        else:
            self.__allData = []   #保存投注的历史记录

        # 保存用户名和密码
        self.__name = _name
        self.__password = _password

        # 用于保存用户的登录状态
        # 默认是没有登录
        self.__isLogin = False

    def __login(self):
        print("=================用户登录====================")
        _name = input("请输入您的用户名：")
        _password = input("请输入您的密码")

        # 判断两个字符串是否相等，用户名、密码
        # __eq__是字符串的方法，用于判断两个字符串是否相同
        if _name.__eq__(self.__name) and _password.__eq__(self.__password):
            print("登陆成功, 即将跳转页面...")
            self.__isLogin = True
        print("=============================================")

    # 添加打印方法
    #   返回双色球相关信息
    def __str__(self):
        return "已选双色球{dcb} {nn} {pp} {red} {blue} {bet}".\
            format(dcb = self.__doubleColorBallInfo,
                   red = self.__redList,
                   blue = self.__blueList,
                   bet = self.__betlist,
                   nn = self.__name, pp = self.__password)

    # 实现下注功能
    def __bet(self):
        bnum = input("请输入投注数：")
        bnum = int(bnum)
        self.__betlist.append(bnum)
        self.__doubleColorBallInfo["注数"]=bnum
        #将你下注的记录添加到历史
        self.__allData.append(copy.deepcopy(self.__doubleColorBallInfo))

    # 实现机选红球
    def __machRed(self):
        reds = [i for i in range(1, 34)]
        rl = random.choices(reds, k = 6)
        self.__redList=rl

        # 在机选红结束后，可以对红球排序
        self.__redList.sort()

    # 实现机选蓝球
    def __machBlue(self):
        blues = [i for i in range(1, 17)]
        rl = random.choices(blues, k = 1)
        self.__blueList=rl

    # 实现自选红球
    def __matuRed(self):
        cnt = 1
        while True:
            rball = input("请选择第{cc}个红球".format(cc = cnt))
            # 将字符串数字转换成整型
            rball = int(rball)
            #判断球号是否在指定范围内
            if not (rball >= 1 and rball <= 33):
                print("     红球范围：（1~33） 请重新选择红球 ")
                continue

            # 判断球号是否重复
            if rball in self.__redList:
                continue

            # 将不重复的球号保存
            self.__redList.append(rball)
            if len(self.__redList) >= 6:
                break
            cnt += 1

        # 退出循环后，红球已经选完
        # 可以执行排序
        self.__redList.sort()

    # 实现自选蓝球
    def __matuBlue(self):
        cnt = 1

        # 使用循环，是因为球号有可能超范围
        #   如果超出范围，需要让用户重新选择
        while True:
            blueball = input("请选择{cc}个蓝色球号:".format(cc = cnt))
            blueball = int(blueball)
            # 判断球号是否在指定范围内
            if not (blueball >= 1 and blueball <= 16):
                print("     蓝球范围：（1~16） 请重新选择蓝球 ")
                continue

            # 将有效球号保存
            self.__blueList.append(blueball)

            # 循环退出条件
            if len(self.__blueList) >= 1:
                break

    # 实现机选红球和蓝球
    def __machDoubleColorBall(self):
        # 机选红球和蓝球
        self.__machRed()
        self.__machBlue()

        # 将结果保存到字典中
        self.__doubleColorBallInfo["红球"]=self.__redList
        self.__doubleColorBallInfo["蓝球"]=self.__blueList

    # 实现自选红球和蓝球
    def __matuDoubleColorBall(self):
        # 机选红球和蓝球
        self.__matuRed()
        self.__matuBlue()

        # 将结果保存到字典中
        self.__doubleColorBallInfo["红球"].extend(self.__redList)
        self.__doubleColorBallInfo["蓝球"].extend(self.__blueList)

    def __pay(self):
        # 计算彩票总的消费
        # 每注彩票2元*注数
        _cost = self.__doubleColorBallInfo["注数"] * 2
        while True:
            print("您本次消费总金额：{cc}".format(cc = _cost))
            _pay = input("请输入结账金额：")
            _pay = int(_pay)
            if _pay >= _cost:
                print("结账成功，找零{pc}".format(pc = _pay - _cost))
                # 如果结账成功，退出循环
                break
            else:
                print("金额不足，请重新输入...")

    # 显示菜单并执行对应编号的功能
    def show(self):
        while True:
            self.__showMenu()

            choice = input("请选择服务:")
            choice = int(choice)

            if choice == 1:
                if self.__isLogin == True:
                    # "自选双色球",
                    self.__matuDoubleColorBall()
                else :
                    self.__login()
            if choice == 2:
                if self.__isLogin == False:
                    self.__login()

                # "机选双色球",
                self.__machDoubleColorBall()
            if choice == 3:
                if self.__isLogin == False:
                    self.__login()
                # "投注",
                self.__bet()
            if choice == 4:
                if self.__isLogin == False:
                    self.__login()
                # "结账"
                self.__pay()
            if choice == 5:
                # "查看历史投注记录",
                for item in self.__allData:
                    print(item)
            if choice == 6:
                # "退出",
                self.save()
                break
    #保存数据
    def save(self):
        with open(self.__fileName,'wb') as f:
            pickle.dump(self.__allData,f)
    #加载数据
    def load(self):
        with open(self.__fileName,'rb') as f:
            self.__allData = pickle.load(f)
if __name__ == '__main__':
    dcb = DoubleColorBall("admin", "123456")
    dcb.doubleColorBallRule()
    dcb.show()

    print(dcb)
